home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / perl / perl5a1.lha / perl5alpha1 / do / grep < prev    next >
Encoding:
Text File  |  1992-08-15  |  1.1 KB  |  50 lines

  1. int
  2. do_grep(arg,TARG,gimme,arglast)
  3. register ARG *arg;
  4. STR *TARG;
  5. int gimme;
  6. int *arglast;
  7. {
  8.     STR **st = stack->ary_array;
  9.     register int dst = arglast[1];
  10.     register int src = dst + 1;
  11.     register int sp = arglast[2];
  12.     register int i = sp - arglast[1];
  13.     int oldsave = savestack->ary_fill;
  14.     SPAT *oldspat = curspat;
  15.     int oldtmps_base = tmps_base;
  16.  
  17.     savesptr(&stab_val(defstab));
  18.     tmps_base = tmps_max;
  19.     if ((arg[1].arg_type & A_MASK) != A_EXPR) {
  20.     arg[1].arg_type &= A_MASK;
  21.     dehoist(arg,1);
  22.     arg[1].arg_type |= A_DONT;
  23.     }
  24.     arg = arg[1].arg_ptr.arg_arg;
  25.     while (i-- > 0) {
  26.     if (st[src]) {
  27.         st[src]->str_pok &= ~SP_TEMP;
  28.         stab_val(defstab) = st[src];
  29.     }
  30.     else
  31.         stab_val(defstab) = str_mortal(&str_undef);
  32.     (void)eval(arg,G_SCALAR,sp);
  33.     st = stack->ary_array;
  34.     if (str_true(st[sp+1]))
  35.         st[dst++] = st[src];
  36.     src++;
  37.     curspat = oldspat;
  38.     }
  39.     restorelist(oldsave);
  40.     tmps_base = oldtmps_base;
  41.     if (gimme != G_ARRAY) {
  42.     str_numset(TARG,(double)(dst - arglast[1]));
  43.     STABSET(TARG);
  44.     st[arglast[0]+1] = TARG;
  45.     return arglast[0]+1;
  46.     }
  47.     return arglast[0] + (dst - arglast[1]);
  48. }
  49.  
  50.